// 3_1_muban.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include<array>
//#define N 10
using namespace std;
////类型模板参数
////非类型模板参数 --常量 int short char  针对整型，不针对浮点型
//template<class T,size_t N>
//class Array {
//private:
//    T a[N];
//};



//int main()
//{
//    Array<int, 10> a;
//    Array<double, 1000> b;
//}

//int main()
//{
//    //c语言的数组，对于越界的检测不严格
//    //越界读不检查，越界写抽查
//    int a[10];
//    //而array就检查得相当严格，就跟前面自己构造得的时候，重载[]时，他会严格检查是否越界
//    array<int,10> a2;
//    return 0;
//}


////特殊化处理
//特化的本质：编译器的匹配原则


template<class T1,class T2>
class Date
{
public:
	Date()

	{
		cout << "Date<class class>"<<endl;
	}
private:
	T1 _a;
	T2 _b;
};
////特殊化处理，相当于对特殊情况进行重新罗列
template<>
class Date<double, char> 
{
public:
	Date() {
		cout << "Date<double,char>" << endl;
	}
};

//半特化,偏特化

template<class T1>
class Date<T1, char>
{
public:
	Date() {
		cout << "Date<T1,char>" << endl;
	}
};
//对参数类型进一步限制
template<class T1,class T2>
class Date<T1*, T2*>
{
public:
	Date() {
		cout << "Date<T1*,T2*>" << endl;
	}
};


template<class T1, class T2>
class Date<T1&, T2&>
{
public:
	Date() {
		cout << "Date<T1&,T2&>" << endl;
	}
};
int main()
{
	Date<int, int> d1;
	Date<double, double> d2;
	Date<int, char> d3;
	Date<double, char> d4;
	Date<double*, double*> d5;  //偏特化
	Date<double, double*> d6;    
	Date<double*, char*> d7;    //偏特化
	Date<double&, char&> d8;    //偏特化
	return 0;
}



//
//class Date
//{
//public:
//	Date(int year, int month, int day)
//		:_year(year)
//		, _month(month)
//		, _day(day)
//	{
//		cout << "Date<class class>";
//	}
//private:
//	int _year;
//	int _month;
//	int _day;
//};
//// 函数模板 -- 参数匹配
//template<class T>
//bool Less(T left, T right)
//{
//	return left < right;
//}
//// 对Less函数模板进行特化
//template<>
//bool Less<Date>(Date left, Date right)
//{
//	return 1;
//}
//int main()
//{
//	cout << Less(1, 2) << endl;
//	Date d1(2022, 7, 7);
//	Date d2(2022, 7, 8);
//	cout << Less(d1, d2) << endl;
//	Date* p1 = &d1;
//	Date* p2 = &d2;
//	cout << Less(p1, p2) << endl; // 调用特化之后的版本，而不走模板生成了
//	return 0;
//}


//模板
// 模板服用了代码，节省了资源，更快的迭代开发，STL因此而产生
// 增强了灵活性
//
// 缺陷
// 模板会导致代码膨胀问题，也会导致编译时间变长
// 出现模板编译错误的时候，报错不明显
//
